//package server;
//
//import io.netty.bootstrap.ServerBootstrap;
//import io.netty.buffer.ByteBuf;
//import io.netty.channel.*;
//import io.netty.channel.nio.NioEventLoopGroup;
//import io.netty.channel.socket.SocketChannel;
//import io.netty.channel.socket.nio.NioServerSocketChannel;
//import io.netty.handler.codec.ByteToMessageDecoder;
//
//import java.util.List;
//
//// 枚举类定义
//enum CommandType {
//    REAL_TIME_INFORMATION((byte) 0x01, "Real-Time Information"),
//    RECHARGE((byte) 0x02, "Recharge"),
//    TERMINAL_CONTROL((byte) 0x03, "Terminal Control");
//
//    private final byte value;
//    private final String description;
//
//    CommandType(byte value, String description) {
//        this.value = value;
//        this.description = description;
//    }
//
//    public byte getValue() {
//        return value;
//    }
//
//    public String getDescription() {
//        return description;
//    }
//
//    public static test.CommandType fromByte(byte value) {
//        for (test.CommandType type : test.CommandType.values()) {
//            if (type.value == value) {
//                return type;
//            }
//        }
//        throw new IllegalArgumentException("Unknown CommandType value: " + value);
//    }
//}
//
//enum ResponseTag {
//    SUCCESS((byte) 0x01, "Success"),
//    FAILURE((byte) 0x02, "Failure");
//
//    private final byte value;
//    private final String description;
//
//    ResponseTag(byte value, String description) {
//        this.value = value;
//        this.description = description;
//    }
//
//    public byte getValue() {
//        return value;
//    }
//
//    public String getDescription() {
//        return description;
//    }
//
//    public static test.ResponseTag fromByte(byte value) {
//        for (test.ResponseTag tag : test.ResponseTag.values()) {
//            if (tag.value == value) {
//                return tag;
//            }
//        }
//        throw new IllegalArgumentException("Unknown ResponseTag value: " + value);
//    }
//}
//
//enum EncryptionType {
//    NONE((byte) 0x01, "None"),
//    RSA((byte) 0x02, "RSA"),
//    AES((byte) 0x03, "AES");
//
//    private final byte value;
//    private final String description;
//
//    EncryptionType(byte value, String description) {
//        this.value = value;
//        this.description = description;
//    }
//
//    public short getValue() {
//        return value;
//    }
//
//    public String getDescription() {
//        return description;
//    }
//
//    public static test.EncryptionType fromShort(byte value) {
//        for (test.EncryptionType type : test.EncryptionType.values()) {
//            if (type.value == value) {
//                return type;
//            }
//        }
//        throw new IllegalArgumentException("Unknown EncryptionType value: " + value);
//    }
//}
//
//// 消息类定义
//class GBT32960Message {
//    private static final byte[] START_BIT = new byte[]{0x23, 0x23};
//    private test.CommandType commandType;
//    private test.ResponseTag responseTag;
//    private byte[] vin;
//    private test.EncryptionType encryptionType;
//    private int length;
//    private byte[] data;
//    private byte checkSum;
//
//    public GBT32960Message(test.CommandType commandType, test.ResponseTag responseTag, byte[] vin, test.EncryptionType encryptionType, int length, byte[] data, byte checkSum) {
//        this.commandType = commandType;
//        this.responseTag = responseTag;
//        this.vin = vin;
//        this.encryptionType = encryptionType;
//        this.length = length;
//        this.data = data;
//        this.checkSum = checkSum;
//    }
//
//    public static byte[] getStartBit() {
//        return START_BIT;
//    }
//
//    public test.CommandType getCommandType() {
//        return commandType;
//    }
//
//    public test.ResponseTag getResponseTag() {
//        return responseTag;
//    }
//
//    public byte[] getVin() {
//        return vin;
//    }
//
//    public test.EncryptionType getEncryptionType() {
//        return encryptionType;
//    }
//
//    public int getLength() {
//        return length;
//    }
//
//    public byte[] getData() {
//        return data;
//    }
//
//    public byte getCheckSum() {
//        return checkSum;
//    }
//}
//
//// 消息解码器
//class GBT32960MessageDecoder extends ByteToMessageDecoder {
//    @Override
//    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
//        if (in.readableBytes() < 24) {
//            return;
//        }
//
//        in.markReaderIndex();
//
//        byte[] startBit = new byte[2];
//        in.readBytes(startBit);
//        if (startBit[0] != 0x23 || startBit[1] != 0x23) {
//            in.resetReaderIndex();
//            throw new IllegalArgumentException("Invalid start bit");
//        }
//
//        byte commandTypeByte = in.readByte();
//        byte responseTagByte = in.readByte();
//        byte[] vin = new byte[17];
//        in.readBytes(vin);
//        byte encryptionTypeShort = in.readByte();
//        int length = in.readShort() & 0xFFFF;
//
//        if (in.readableBytes() < length + 1) {
//            in.resetReaderIndex();
//            return;
//        }
//
//        byte[] data = new byte[length];
//        in.readBytes(data);
//        byte checkSum = in.readByte();
//
//        test.CommandType commandType = test.CommandType.fromByte(commandTypeByte);
//        test.ResponseTag responseTag = test.ResponseTag.fromByte(responseTagByte);
//        test.EncryptionType encryptionType = test.EncryptionType.fromShort(encryptionTypeShort);
//
//        test.GBT32960Message message = new test.GBT32960Message(commandType, responseTag, vin, encryptionType, length, data, checkSum);
//
//
//        out.add(message);
//    }
//}
//
//// 服务器处理器
//class GBT32960ServerHandler extends SimpleChannelInboundHandler<test.GBT32960Message> {
//    @Override
//    protected void channelRead0(ChannelHandlerContext ctx, test.GBT32960Message msg) throws Exception {
//
//        System.out.println("Data: " + new String(msg.getData()));
//    }
//
//    @Override
//    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
//        cause.printStackTrace();
//        ctx.close();
//    }
//}
//
//// 服务器类
//public class GBT32960Server {
//
//    private final int port;
//
//    public GBT32960Server(int port) {
//        this.port = port;
//    }
//
//    public void start() throws InterruptedException {
//        EventLoopGroup bossGroup = new NioEventLoopGroup();
//        EventLoopGroup workerGroup = new NioEventLoopGroup();
//        try {
//            ServerBootstrap b = new ServerBootstrap();
//            b.group(bossGroup, workerGroup)
//                    .channel(NioServerSocketChannel.class)
//                    .childHandler(new ChannelInitializer<SocketChannel>() {
//                        @Override
//                        protected void initChannel(SocketChannel ch) {
//                            ChannelPipeline pipeline = ch.pipeline();
//                            pipeline.addLast(new test.GBT32960MessageDecoder());
//                            pipeline.addLast(new test.GBT32960ServerHandler());
//                        }
//                    });
//
//            ChannelFuture f = b.bind(port).sync();
//            System.out.println("Server started on port " + port);
//            f.channel().closeFuture().sync();
//        } finally {
//            bossGroup.shutdownGracefully();
//            workerGroup.shutdownGracefully();
//        }
//    }
//
//    public static void main(String[] args) throws InterruptedException {
//        new test.GBT32960Server(8080).start();
//    }
//    }
